/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.database.bean;

import com.database.dao.AsignacionesDao;
import com.database.dao.CategoriaDao;
import com.database.dao.IncidenciaDao;
import com.database.dao.BaseConocimientoDao;
import com.database.dao.UsuarioDao;
import com.database.dao.impl.AsignacionesDaoImplement;
import com.database.dao.impl.CategoriaDaoImplement;
import com.database.dao.impl.IncidenciaDaoImplement;
import com.database.dao.impl.BaseConocimientoDaoImplement;
import com.database.dao.impl.UsuarioDaoImplement;
import com.database.model.Incidencia;
import com.database.model.BaseConocimiento;
import com.database.model.Categoria;
import com.database.model.Usuario;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;


/**
 *
 * @author diego
 */
@ManagedBean(name="IncidenciaBean") 
@SessionScoped
public class IncidenciaBean {
     
    private Incidencia incidencia;
    private List<Incidencia> incidencias;
    private List<Usuario> asignados;
    private int codCategoria;// Codigo de la categoria Seleccionada
    private int codAsignado; // Codigo del Usuario seleccionado
    private int solicitante;
    private int baseConocimientoKb;
    private int codProblemaKb; // Es el codigo del problema para saber si ya ha sido registrada
    private String prioridad;
    private List<Incidencia> incidenciasReportadas;
    private List<Incidencia> incidenciasxResolver;
    private String estado; 
    private Calendar fechaActual;
    private AsignacionesDao asignacionesDao;
    
    
     /**
     * Creates a new instance of IncidenciaBean
     */
    public IncidenciaBean() {
    
    }
    
    public Incidencia getIncidencia() {
        
        if(incidencia==null){
           incidencia=new Incidencia();
        }
        return incidencia;
    }

    public void setIncidencia(Incidencia incidencia) {
        this.incidencia = incidencia;
    }

    public List<Incidencia> getIncidencias() {
        IncidenciaDao incidenciaDao = new IncidenciaDaoImplement(); 
        incidencias= incidenciaDao.buscarTodas();
        return incidencias;
    }
    
     public void prepararIncidencia(Integer id){
         IncidenciaDao incidenciaDao = new IncidenciaDaoImplement();
         this.incidencia = new Incidencia();
         incidencia= incidenciaDao.buscarPorId(id);
    }
     
     
       public void preparInsertar(){
        incidencia = new Incidencia();
    }
    
       /*
        * Se encarga de Almacenar el objeto Incidencia a través
        * de insertar, en la implemetneacion de la incidencia.
        */
         public void insertar(){
          
         UsuarioDao usuarioDao = new UsuarioDaoImplement();
         CategoriaDao categoriaDao = new CategoriaDaoImplement();
         BaseConocimientoDao baseConocimientoDao = new BaseConocimientoDaoImplement();
         
         incidencia.setEstado("ASIGNADA");
         
//         System.err.println("Este es el titulo entrante que debe ser nulo: " + incidencia.getTitulo());
//         System.err.println("Esta es la descripcion verdadera:  " + incidencia.getDescripcion());
         
         incidencia.setCategoria(categoriaDao.buscarPorId(codCategoria));
         
//         System.err.println("Codigo de Solicitante :   " + solicitante );
//         System.err.println("Codigo de Asignado :   " + asignado);
          
         Usuario usuarioSolicitante = usuarioDao.buscarPorId(solicitante);
         Usuario usuarioAsignado=usuarioDao.buscarPorId(this.codAsignado);
  
//         System.err.println("El asignado final es:" + asignado);
         
         incidencia.setUsuarioByUsuarioSolicitante(usuarioSolicitante);
         incidencia.setUsuarioByUsuarioAsignado(usuarioAsignado);
         incidencia.setPrioridad(prioridad);
         
         asignarFechaRegistro();
         
         if(incidencia.getBaseConocimiento()==null){//Como la incidencia es nueva, ademàs de insertarla 
                                                    // La agrego a la Base conocimiento para ser Resuelta.
             BaseConocimiento nuevoProblema=new BaseConocimiento();
             incidencia.setBaseConocimiento(baseConocimientoDao.buscarPorId(0));
             nuevoProblema.setProblema(incidencia.getTitulo());
             baseConocimientoDao.insertar(nuevoProblema);
             
         }
         
//         System.err.println("Fecha Ultima" + incidencia.getApertura());
//         System.err.println("Categoria id" + codCategoria);
//         System.err.println("Categoria objeto " + incidencia.getCategoria().getNombre());
//         System.err.println("Titulo: " + incidencia.getTitulo() );
//         System.err.println("Prioridad" + incidencia.getPrioridad());
//         System.err.println("Descripcion" + incidencia.getDescripcion());
//         System.err.println("Estado" + incidencia.getEstado());
//         
//         System.err.println("Nombre Solicitante " + incidencia.getUsuarioByUsuarioSolicitante().getNombres());
//         System.err.println("Nombre Asignaodo " + incidencia.getUsuarioByUsuarioAsignado().getNombres());
//         
//         System.err.println("Listo para insertar....Linea107");
             
//         preparInsercionIncidencia();
         

         
         IncidenciaDao incidenciaDao = new IncidenciaDaoImplement();
         incidenciaDao.insertar(incidencia);
         incidencia = new Incidencia();
    }
    
     public void actualizar(){
         UsuarioDao usuarioDao = new UsuarioDaoImplement();
         IncidenciaDao incidenciaDao = new IncidenciaDaoImplement();
         CategoriaDao categoriaDao = new CategoriaDaoImplement();
         
         Usuario usuarioAsignado=usuarioDao.buscarPorId(this.codAsignado);
         Categoria categoriaActualiada= categoriaDao.buscarPorId(codCategoria);
         
         this.incidencia.setUsuarioByUsuarioAsignado(usuarioAsignado);
         this.incidencia.setCategoria(categoriaActualiada);
         
         incidenciaDao.actualizar(this.incidencia);
         this.incidencia = new Incidencia();
    }
     
     public void eliminar(){
         IncidenciaDao incidenciaDao = new IncidenciaDaoImplement();
         incidenciaDao.eliminar(incidencia); 
         incidencia = new Incidencia();
     }

    public int getCodCategoria() {
        return codCategoria;
    }

    public void setCodCategoria(int codCategoria) {
        this.codCategoria = codCategoria;
    }

    public int getCodAsignado() {
        return codAsignado;
    }

    public void setCodAsignado(int asignado) {
        this.codAsignado = asignado;
    }

    public int getSolicitante() {
        return solicitante;
    }

    public void setSolicitante(int solicitante) {
        this.solicitante = solicitante;
    }
    
    
    public void preparInsercionIncidencia(){
       
    }

    public int getBaseConocimientoKb() {
        return baseConocimientoKb;
    }

    public void setBaseConocimientoKb(int baseConocimientoKb) {
        this.baseConocimientoKb = baseConocimientoKb;
    }

    public String getPrioridad() {
        return prioridad;
    }

    public void setPrioridad(String prioridad) {
        this.prioridad = prioridad;
    }
 
     public List<Incidencia> incidenciasReportadasPorUsuarioLogueado(Usuario usuarioSolicitante) {
        IncidenciaDao incidenciaDao = new IncidenciaDaoImplement(); 
        this.incidenciasReportadas= incidenciaDao.buscarTodasReportadasxUsuario(usuarioSolicitante);
        return incidenciasReportadas;
    }

    public int getCodProblemaKb() {
        return codProblemaKb;
    }

    public void setCodProblemaKb(int codProblema) {
        this.codProblemaKb = codProblema;
    }
     
     public List<Incidencia> incidenciasxResolverPorUsuarioLogueado(Usuario usuarioAsignado) {
        IncidenciaDao incidenciaDao = new IncidenciaDaoImplement(); 
        this.incidenciasxResolver= incidenciaDao.buscarxResolverxUsuario(usuarioAsignado);
        return incidenciasxResolver;
    }

    public String getEstado() {
        return this.estado;
    }

    
      public void asignarFechaRegistro(){
        Calendar calendar = Calendar.getInstance();
        calendar.set(Calendar.HOUR_OF_DAY, Calendar.HOUR);
        calendar.set(Calendar.MINUTE, calendar.getActualMaximum(Calendar.MINUTE));
        calendar.set(Calendar.SECOND, calendar.getActualMaximum(Calendar.SECOND));
        incidencia.setApertura(calendar.getTime());
    }

      /**
       * Formatea la Fecha que Visualiza el Usuario al momento de Registrar
       * La incidencia.
       * @return 
       */
    public String getFechaActual() {
        Calendar calendar = Calendar.getInstance();
        String[] mes = { "Enero", "Febrero", "Marzo", "Abril", "Mayo", "Junio",
			"Julio", "Agosto", "Septiembre", "Octubre", "Noviembre",
                        "Diciembre" };
	// Arreglo con los nombres de los dias de la semana
	String[] diaSemana = { "Domingo", "Lunes", "Martes", "Miercoles",
			"Jueves", "Viernes", "Sabado" };
	// Formato de salida de la fecha
	String fechaPersonalizada = 
				 diaSemana[calendar.get(Calendar.DAY_OF_WEEK) - 1] + " "
				+ calendar.get(Calendar.DATE) + " de "
				+ mes[calendar.get(Calendar.MONTH)] + " del año "
				+ calendar.get(Calendar.YEAR);
        return (fechaPersonalizada);
    }

    public void setFechaActual(Calendar fechaActual) {
        this.fechaActual = fechaActual;
    }

    public List<Usuario> getAsignados() {
        return asignados;
    }

    public void setAsignados(List<Usuario> asignados) {
        this.asignados = asignados;
    }

    public AsignacionesDao getAsignacionesDao() {
        return asignacionesDao;
    }

    public void setAsignacionesDao(AsignacionesDao asignacionesDao) {
        this.asignacionesDao = asignacionesDao;
    }
    
                
     public void manejarCambioCategoria() {
         this.asignacionesDao= new AsignacionesDaoImplement();
        if(codCategoria!=0) { 
            this.asignados = this.asignacionesDao.usuariosDisponiblesxCategoria(codCategoria);  
        } else { 
            this.asignados = new ArrayList<Usuario>();  
    }     }

    }

